package com.gpstracking.Servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.jms.Session;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import com.gpstracking.BE.Area;
import com.gpstracking.BE.Punto;
import com.gpstracking.BE.Usuario;
import com.gpstracking.BL.AreaBL;
import com.gpstracking.GData.GArea;
import com.gpstracking.Utils.Geometry.Point;

/**
 * Servlet implementation class ServletCreateArea
 */
public class ServletArea extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
	AreaBL areaBL = new AreaBL();
    public ServletArea() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */

    public void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		
		String dias = request.getParameter("dias");//cuantos dias se quieren mostrar en el mapa
		String areasDesactivadas = request.getParameter("areasDesactivadas");//estos son la lista de dispositivos que desactivo
		String idArea = request.getParameter("idArea");
		
		HttpSession sesion = request.getSession(true);
		
		Usuario user = (Usuario) sesion.getAttribute("user");
		
		PrintWriter out = response.getWriter();
		
		if ( idArea == null || idArea.isEmpty() ){
			Object areas = findAll( dias, areasDesactivadas, user );
			out.println( areas );
		}else{
			//System.out.println( idArea );
			Object area = findId( dias, idArea, user );
			out.println( area );
		}
		out.flush();
		out.close();	
		
		
	}
		
	private Object findId( String dias, String idArea, Usuario usuario ){
		Area area = areaBL.findById( Integer.parseInt( idArea ),usuario );
		JSONObject jsonArea = new JSONObject();
		jsonArea.put("AreaId",area.getIdArea());
		jsonArea.put("Nombre",area.getNombre());
		jsonArea.put("Descripcion",area.getDescripcion());
		jsonArea.put("Color",area.getColor());
		JSONArray puntos = new JSONArray();
		Set as = area.getPuntos();
		Iterator it = as.iterator();
		while( it.hasNext()){
			Punto p = ( Punto ) it.next(); 
			JSONObject punto= new JSONObject();
			punto.put("Latitud", p.getLatitud());
			punto.put("Longitud", p.getLongitud());
			puntos.add(punto);
		}
		jsonArea.put("Puntos", puntos);
		return jsonArea;
		}
		
		private Object findAll(String dias, String areasDesactivadas, Usuario usuario) {
		
		//falta filtrar dispositivos
		//falta agregar esto.. deberia tener en texto toda la informacion que quiero q tenga del dispositivo (como cual fue la ultima notificacion que lanzo.. etc).. puede incluir links a imagenes
		List<Area> listaAreas = areaBL.listarAreas(usuario); //esto bota las areas activas
		JSONArray arrayObj = new JSONArray();
		
		for (Area area : listaAreas){
			if (isNotSelected(area.getIdArea(),areasDesactivadas)&&(area.getPuntos().size()>0)){
				//si el dispositivo no es seleccionado fuera de la lista que no se quieren ver.. extraigo su posicion
				//inicialmente json deberia estar vacio por lo que todos son seleccionados
				JSONObject jsonArea = new JSONObject();
				jsonArea.put("AreaId",area.getIdArea());
				jsonArea.put("Nombre",area.getNombre());
				jsonArea.put("Descripcion",area.getDescripcion());
				jsonArea.put("Color",area.getColor());
				JSONArray puntos = new JSONArray();
				Set as = area.getPuntos();
				Iterator it = as.iterator();
				while( it.hasNext()){
					Punto p = ( Punto ) it.next(); 
					JSONObject punto= new JSONObject();
					punto.put("Latitud", p.getLatitud());
					punto.put("Longitud", p.getLongitud());
					puntos.add(punto);
				}
				jsonArea.put("Puntos", puntos);
				arrayObj.add(jsonArea);
			}			
		}
		return arrayObj;
	}

	private boolean isNotSelected(int idDispositivo, String json) {
		// TODO Auto-generated method stub
		return true;
	}
		
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		String idArea = request.getParameter("idarea");
		
		System.out.println( "tesis" );
		
		String jsonPuntos = request.getParameter("puntos");
		String nombre = request.getParameter("nombre");
		String descripcion = request.getParameter("descripcion");
		String color = request.getParameter("color");
		List<Point> puntos = GArea.getPoints( jsonPuntos );
		
		HttpSession session = request.getSession(true);
		Usuario usuario = (Usuario)session.getAttribute("user");

		
		AreaBL controller = new AreaBL();
		PrintWriter out = response.getWriter();
		
		
		if ( idArea.equals("0") ){
			System.out.println( usuario.getIdUsuario() );
			boolean res = controller.registrar(nombre, descripcion, color, puntos, usuario);
			if ( res ){
				out.print("R1");
			}else{
				out.print("R0");
			}
		}else{
			boolean res = controller.modificar(Integer.parseInt(idArea), nombre, descripcion, color, puntos, usuario);
			if ( res ){
				out.print("M1");
			}else{
				out.print("M0");
			}			
		}

	}

}
